package com.tanhua.server.service;

import com.tanhua.autoconfig.template.HuanXinTemplate;
import com.tanhua.autoconfig.template.SmsTemplate;
import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.dubbo.api.UserApi;
import com.tanhua.model.domain.User;
import com.tanhua.model.vo.ErrorResult;
import com.tanhua.server.exception.BusinessException;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class UserService {

    @Autowired
    private SmsTemplate template;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @DubboReference
    private UserApi userApi;

    @Autowired
    private HuanXinTemplate xinTemplate;

    /**
     * 发送手机验证码
     *  phone：手机号
     */
    public void login(String phone) {
        //1、随机获取6位的数字验证码
        //String code = RandomStringUtils.randomNumeric(6);
        String code = "123456";
        //2、存入redis：60秒有效
        redisTemplate.opsForValue().set("CODE_"+phone,code,1, TimeUnit.MINUTES);
        //3、发送短信
        //template.sendSms(phone,code);
    }

//    @Autowired
//    private RabbitTemplate rabbitTemplate;

    @Autowired
    private MqMessageService mqMessageService;

    /**
     * 用户登录
     * @param phone  手机号码
     * @param code   验证码
     * @return
     */
    public Map loginVerification(String phone, String code) {
        //1、获取redis中的验证码
        String key = "CODE_" + phone;
        String value = redisTemplate.opsForValue().get(key);
        //2、判断用户登录输入的验证码和redis中的验证码是否一致
        //2.1 如果不一致：抛出异常
        if(StringUtils.isEmpty(value) || !code.equals(value)) {
            //throw new RuntimeException(); //判处异常，手机端自动判断
            ErrorResult result = ErrorResult.loginError(); //错误信息
            throw new BusinessException(result);
        }
        //2.2 如果验证码正确，删除redis中的验证码
        redisTemplate.delete(key);
        //3、根据手机号码查询用户
        User user = userApi.findByMobile(phone);
        //3.1 判断用户是否存在，如果不存在，创建新用户保存到tb_user表中
        Boolean isNew = false; //默认老用户
        String type = "0101" ;//登录
        if(user == null) {
            type = "0102";
            user = new User();
            user.setMobile(phone);
            user.setPassword("123456");
            Long userId = userApi.save(user);
            user.setId(userId);
            isNew = true;
            //将新用户数据，注册到环信
            Boolean create = xinTemplate.createUser("hx" + userId, "123456");
            if(create) {
                user.setHxUser("hx"+userId);
                user.setHxPassword("123456");
                userApi.update(user);
            }
        }

        mqMessageService.sendLogService(user.getId(),type,
                "user",null);
//        try {
//            Map<String,String> map = new HashMap(); //
//            map.put("userId",user.getId().toString());
//            map.put("type",type);
//            map.put("logTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
//            String message = JSON.toJSONString(map);
//            rabbitTemplate.convertAndSend("tanhua.log.exchange","log.user",message);  //发送消息可能会失败
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        //4、生成token字符串（id,mobile）
        Map map = new HashMap();
        map.put("id",user.getId());
        map.put("mobile",user.getMobile());
        String token = JwtUtils.getToken(map);
        //5、构建map的返回值（token，isNew）
        Map retMap = new HashMap();
        retMap.put("token",token);
        retMap.put("isNew",isNew);
        return retMap;
    }


//    public User findByMobile(String mobile) {
//        return userApi.findByMobile(mobile);
//    }
}
